#include <vector>
#include <iostream>

using namespace std;

class Node {
public:
  // 什么叫做类的属性？
  int value;
  Node *left;
  Node *right;

  // 构造函数
  // 描述如何创建一个 Node
  Node(int v, Node *l, Node *r): value(v), left(l), right(r) {
    cout << "A node with value: " << v << " is created." << endl;
  }
};

class Tree {
public:
  Node *root; // 这棵树的树根在哪
  Tree(Node *r) : root(r) {
    cout << "A tree is created." << endl;
  }

  // 方法：一个类型支持的动作或者行为
  // 让 tree 支持遍历
  // 从 pn 指向的节点开始遍历
  // 先序遍历
  void preOrderTraverse(Node *pn) {
    // 按特定的顺序来走遍树的每一个节点
    if (pn == nullptr) { return; }

    cout << pn->value << endl;

    if (pn->left == nullptr && pn->right == nullptr) {
      return;
    }

    traverse(pn->left);
    traverse(pn->right);
  }

  void traverse() {
    traverse(root);
  }
};

int main(int argc, char const *argv[])
{
  /* code */
  Node one {1, nullptr, nullptr};
  Node two {2, nullptr, nullptr};
  Node three {3, nullptr, nullptr};
  Node four {4, nullptr, nullptr};
  Node five {5, nullptr, nullptr};
  Node six {6, nullptr, nullptr};
  Node seven {7, nullptr, nullptr};
  Node nine {9, nullptr, nullptr};

  one.left = &two;
  one.right = &three;

  two.left = &four;
  two.right = &five;

  three.left = &six;
  three.right = &seven;

  four.left = &nine;

  Tree t{&one};

  // 如何确定树的结构是正确的？
  // 遍历树的方法，如何 cout 一棵树
  // 
  t.traverse();
  return 0;
}
